# -*- codeing = utf-8 -*-
# @Time : 2021/2/28 13:59
# @Atuthor: 朱朱
# @File: 156生成器.py
# @Software: PyCharm
""
"""
利用迭代器，我们可以在每次迭代获取数据（通过next()方法）时按照特定的规律进行生成。
但是我们在实现一个迭代器时，关于当前迭代到的状态需要我们自己记录，
进而才能根据当前状态生成下一个数据。
为了达到记录当前状态，并配合next()函数进行迭代使用，
我们可以采用更简便的语法，即生成器(generator)。生成器是一类特殊的迭代器。

要创建一个生成器，有很多种方法。
第一种方法很简单，只要把一个列表生成式的 [ ] 改成 ( )
只要在def中有yield关键字的 就称为 生成器

总结
使用了yield关键字的函数不再是函数，而是生成器。（使用了yield的函数就是生成器）
yield关键字有两点作用：
保存当前运行状态（断点），然后暂停执行，即将生成器（函数）挂起
将yield关键字后面表达式的值作为返回值返回，此时可以理解为起到了return的作用
可以使用next()函数让生成器从断点处继续执行，即唤醒生成器（函数）
"""
# 最简单的生成器
g = (i for i in range(10)) # 简单生成器将[]换成()
for m in g:
    print(m,end=' ')
print('----------------------')

# 迭代器是一个对象，定义class
# 生成器写法上像一个函数
def my_generator(n):
    i = 0
    while i<n:
        yield i # yield关键字,将函数变成生成器
        i+=1


# --------------------------
def fibonacci(n):
    num1 = num2 =1
    count =0
    while count <= n-2:
        num1,num2 = num2,num1+num2
        count+=1
        yield num1

f = fibonacci(10)
for i in f:
    print(i)

print(f)
print('----------------------')
# --------------------------
g = my_generator(10)
print(g) # <generator object my_generator at 0x0000017F5C32C5C8>
for i in g:
    print(i, end=' ')



